package clinet;
// **********************************************************************
//
// Copyright (c) 2003-2013 ZeroC, Inc. All rights reserved.
//
// This copy of Ice is licensed to you under the terms described in the
// ICE_LICENSE file included in this distribution.
//
// **********************************************************************

import Demo.*;

public class Client extends Ice.Application {

	class ShutdownHook extends Thread {
		public void run() {
			try {
				communicator().destroy();
			} catch (Ice.LocalException ex) {
				ex.printStackTrace();
			}
		}
	}

	private static void menu() {
		System.out.println("usage:\n" + "t: send greeting as twoway\n"
				+ "o: send greeting as oneway\n"
				+ "O: send greeting as batch oneway\n"
				+ "d: send greeting as datagram\n"
				+ "D: send greeting as batch datagram\n"
				+ "f: flush all batch requests\n" + "T: set a timeout\n"
				+ "P: set a server delay\n" + "S: switch secure mode on/off\n"
				+ "s: shutdown server\n" + "x: exit\n" + "?: help\n");
	}

	public int run(String[] args) {
		if (args.length > 0) {
			System.err.println(appName() + ": too many arguments");
			return 1;
		}

		//
		// Since this is an interactive demo we want to clear the
		// Application installed interrupt callback and install our
		// own shutdown hook.
		//
		setInterruptHook(new ShutdownHook());

		HelloPrx twoway = HelloPrxHelper.checkedCast(communicator()
				.propertyToProxy("Hello.Proxy").ice_twoway().ice_timeout(-1)
				.ice_secure(false));

		if (twoway == null) {
			System.err.println("invalid proxy");
			return 1;
		}

		HelloPrx oneway = (HelloPrx) twoway.ice_oneway();				//
		HelloPrx batchOneway = (HelloPrx) twoway.ice_batchOneway();		//
		HelloPrx datagram = (HelloPrx) twoway.ice_datagram();			//
		HelloPrx batchDatagram = (HelloPrx) twoway.ice_batchDatagram();	//

		boolean secure = false;
		int timeout = -1;
		int delay = 0;

		menu();

		java.io.BufferedReader in = new java.io.BufferedReader(
				new java.io.InputStreamReader(System.in));

		String line = null;
		do {
			try {
				System.out.print("==> ");
				System.out.flush();
				line = in.readLine();
				if (line == null) {
					break;
				}
				if (line.equals("t")) {
					twoway.sayHello(delay);
				} else if (line.equals("o")) {
					oneway.sayHello(delay);
				} else if (line.equals("O")) {
					batchOneway.sayHello(delay);
				} else if (line.equals("d")) {
					if (secure) {
						System.out.println("secure datagrams are not supported");
					} else {
						datagram.sayHello(delay);
					}
				} else if (line.equals("D")) {
					if (secure) {
						System.out.println("secure datagrams are not supported");
					} else {
						batchDatagram.sayHello(delay);
					}
				} else if (line.equals("f")) {
					communicator().flushBatchRequests();
				} else if (line.equals("T")) {
					if (timeout == -1) {
						timeout = 2000;
					} else {
						timeout = -1;
					}

					twoway = (HelloPrx) twoway.ice_timeout(timeout);
					oneway = (HelloPrx) oneway.ice_timeout(timeout);
					batchOneway = (HelloPrx) batchOneway.ice_timeout(timeout);

					if (timeout == -1) {
						System.out.println("timeout is now switched off");
					} else {
						System.out.println("timeout is now set to 2000ms");
					}
				} else if (line.equals("P")) {
					if (delay == 0) {
						delay = 2500;
					} else {
						delay = 0;
					}

					if (delay == 0) {
						System.out.println("server delay is now deactivated");
					} else {
						System.out.println("server delay is now set to 2500ms");
					}
				} else if (line.equals("S")) {
					secure = !secure;

					twoway = (HelloPrx) twoway.ice_secure(secure);
					oneway = (HelloPrx) oneway.ice_secure(secure);
					batchOneway = (HelloPrx) batchOneway.ice_secure(secure);
					datagram = (HelloPrx) datagram.ice_secure(secure);
					batchDatagram = (HelloPrx) batchDatagram.ice_secure(secure);

					if (secure) {
						System.out.println("secure mode is now on");
					} else {
						System.out.println("secure mode is now off");
					}
				} else if (line.equals("s")) {
					twoway.shutdown();
				} else if (line.equals("x")) {
					// Nothing to do
				} else if (line.equals("?")) {
					menu();
				} else {
					System.out.println("unknown command `" + line + "'");
					menu();
				}
			} catch (java.io.IOException ex) {
				ex.printStackTrace();
			} catch (Ice.LocalException ex) {
				ex.printStackTrace();
			}
		} while (!line.equals("x"));

		return 0;
	}

	public static void main(String[] args) {
		Client app = new Client();
		int status = app.main("Client", args, "config.client");
		System.exit(status);
	}
}
